/***************************************************************************
 创建者: 华磊
 开始时间: 2018.8.14
 copyright: (C) 华友高科
 修改说明: (每次有修改就添加一条，带有 修改人，修改时间，修改描述)
 example (1) hualei 2017.5.8 类的具体实现代码编写

 ***************************************************************************
 *  @file x.h
 *  功能:
 *
 *                                                                         *
 ***************************************************************************/
#ifndef AUTHORITYALLOWANCE_H
#define AUTHORITYALLOWANCE_H
#include <qstring.h>
#include <qdatetime.h>
#include "MacroDefine/GeneralDefine.h"
#include "XmlParse.h"
#include "modedecryptbase.h"

#define BOOT_COUNT_LIMIT 100000000
enum E_READ_USER_INFO
{
    E_READ_USER_INFO_OK=1,
    E_READ_USER_INFO_ERROR_NO_FILE=-1,
    E_READ_USER_INFO_ERROR_NO_NODE_USER=-2,
    E_READ_USER_INFO_ERROR_NO_NODE_ADMIN=-3,
    E_READ_USER_INFO_ERROR_NO_NODE_POLLCODE=-4,
    E_READ_USER_INFO_ERROR_NO_NODE_BOOT_COUNT=-5,
    E_READ_USER_INFO_ERROR_NO_NODE_SERIAL_METHOD=-6,

};

enum E_REGISTER_FAILED_CODE
{
    E_REGISTER_FAILED_CODE_NO_FILE=1,
    E_REGISTER_FAILED_CODE_NO_NODE=2,
    E_REGISTER_FAILED_CODE_BOOT_COUNT_EXCEED=3,
    E_REGISTER_FAILED_CODE_DATE_PASSED=4,
};
/**
 * @brief The AuthorityAllowance class 授权管理类
 */
class AuthorityAllowance:XmlParse
{
public:
    AuthorityAllowance(QString fileNameIn,QString licenseFileNameIn);

public:
    int getLicenseDayLefted();
    int setRegisterNumber(string registerString, ReturnRegisterStatus &returnStatus);
    int loginIn(UserInfo userInfo);

    /**
     * @brief changePasswd              修改密码，管理员可以更改所有的的密码，普通用户只能修改普通用户密码       user
     * @param userInfo                  用户信息
     * @param oldPassed                 旧密码
     * @param newPasswd                 新密码
     * @return				０标示失败，１标示成功
     */
    int changePasswd(UserInfo userInfo,int changeAccount,std::string oldPasswd, std::string newPasswd,int &returnFlag);

    /**
     * @brief checkPollCodeStatus       检测注册码状态
     * @return
     */
    int getAuthorityStatus();
    int refreshAuthorityStatus();

    QString getLockTime();
    QString getRegisterNumber();
    QString getHardDiskSerialNumber();//获取本机硬件序列号

private:
    void saveRegFile(QString xmlFile);
    /**
     * @brief readUserInfo        获取用户的一些基本信息，普通用户密码，管理员密码
     * @param xmlFile             文件名
     */
    int readUserInfo(QString xmlFile);

    /**
     * @brief readUserInfo        获取注册码
     * @param xmlFile             文件名
     */
    int readLicenseInfo(QString xmlFile);

    /**
     * @brief decrypt       解密注册码文件
     * @param s             注册码
     * @return
     */
    POLLCODE_STATUS_TYPE decrypt(QString s);
    /**
     * @brief getNum        解密获取序列号
     * @param s             注册码
     * @return              序列号
     */
    QString getNum(QString s);
    /**
     * @brief getDate       解密获取锁机日期
     * @param s             注册码
     * @return              锁机日期
     */
    QString getDate(QString s);
    /**
     * @brief checkDate     检验锁机日期是否过期
     * @param text          锁机日期
     * @return
     */
    int checkDate(QString text);
    /**
     * @brief getDayInYear      获取当前天是一年中的第多少天
     * @param year              年
     * @param month             月
     * @param day               日
     * @return
     */
    int getDayInYear(int year,int month,int day);
    /**
     * @brief isLeep        判断是否是闰年
     * @param year          年
     * @return
     */
    bool isLeep(int year);

    /**
     * @brief getStandardNum    获取硬件序列号
     * @return                  序列号
     */
    QString getStandardNum();

private:
    QString fileName;
    /**
     * @brief licenseFileName       授权文件路径
     */
    QString licenseFileName;

    int registerType;
    /**
     * @brief userPwd       普通用户密码
     */
    QString userPwd;
    /**
     * @brief adminPwd      管理员密码
     */
    QString adminPwd;

    /**
     * @brief currentDateTime       当前时间
     */
    QDateTime currentDateTime;
    /**
     * @brief serialNumber          硬件序列号
     */
    QString serialNumber;
    /**
     * @brief pollCodeStr           注册码
     */
    QString pollCodeStr;
    /**
     * @brief currentBootCount 　程序启动次数
     */
    int currentBootCount;
    /**
     * @brief lockMachineStr        锁机日期
     */
    QString lockMachineStr;
    int serialCodeMethod;
    /**
     * @brief userInfoList          所有登录用户的用户信息
     */
    QVector <UserInfo> userInfoList;

};

#endif // AUTHORITYALLOWANCE_H
